package com.mxd.ik.common.advice;


import com.mxd.ik.common.result.Result;
import lombok.SneakyThrows;
import org.springframework.core.MethodParameter;
import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;

/**
 * 全局响应包装器
 *
 * @RestControllerAdvice = @ControllerAdvice + @ResponseBody
 * 用于全局处理控制器的响应
 */
@RestControllerAdvice
public class GlobalResponseAdvice implements ResponseBodyAdvice<Object> {


    /**
     * 判断是否需要包装
     *
     * @param returnType 方法返回类型
     * @param converterType 消息转换器类型
     * @return true-需要包装，false-不需要
     */
    @Override
    public boolean supports(MethodParameter returnType,
                            Class<? extends HttpMessageConverter<?>> converterType) {
        // 如果已经是 Result 类型，就不需要再包装了
        return !returnType.getParameterType().equals(Result.class);
    }

    /**
     * 包装响应体
     *
     * @param body 原始响应体
     * @param returnType 返回类型
     * @param selectedContentType 内容类型
     * @param selectedConverterType 选中的转换器类型
     * @param request 请求
     * @param response 响应
     * @return 包装后的响应体
     */
    @SneakyThrows  // Lombok注解，自动处理异常
    @Override
    public Object beforeBodyWrite(Object body,
                                  MethodParameter returnType,
                                  MediaType selectedContentType,
                                  Class<? extends HttpMessageConverter<?>> selectedConverterType,
                                  ServerHttpRequest request,
                                  ServerHttpResponse response) {

        // 其他类型，直接包装
        return Result.success(body);
    }
}

